Este manual é para quem opera um contest: o dono da
conta .admin. Ele explica cada aba do painel de
administração, cada opção de configuração, como habilitar os
papéis especiais (.judge, .cjudge,
.staff, .cstaff, .mon), e como
ligar a correção validada por juízes — incluindo
quantas pessoas você precisa.
Criar o contest (wizard, problemas, contas) é o outro guia: o tutorial do organizador. Aqui é a OPERAÇÃO, do dia da prova.
Você chega ao painel logando com a conta .admin do
contest e clicando em Administração na barra do
topo.
O painel abre na 🏁 Central. A barra de cima tem os
quatro grupos comuns, que todo contest tem, e — depois
de um separador — os grupos de evento, que só aparecem
quando o contest liga o módulo correspondente (seção
1½). Cada grupo tem seus painéis na segunda linha. O endereço guarda o
painel (#grupo/painel), então dá para salvar o link — os
links antigos (#settings, #users,
#machines, #prova/rodadas…) continuam
funcionando, redirecionados. Um link para um painel de módulo
desligado cai em Central › Módulos com
um aviso dizendo qual módulo ligar.
[🏁 Central] [🧩 Prova] [👥 Pessoas] [🎛️ Operação] │ [🏟️ Evento] [🖥️ Máquinas] 📖 Manual
└── só com módulo ligado ──┘
| Grupo | Painéis | Aparece |
|---|---|---|
| 🏁 Central | Central · Módulos · Regras | sempre |
| 🧩 Prova | Problemas · Relatório | sempre |
| 👥 Pessoas | Contas · Inscrições (inscricoes) · Sessões |
sempre (Inscrições só com o módulo) |
| 🎛️ Operação | Situação · Staff · Juízes · Auditoria | sempre |
| 🏟️ Evento | Rodadas (rodadas) · Documentos
(documentos) · Balões (baloes) · Classificação
(classificacao) · Times (sedes ou
telao) · Coortes (coortes) · Sedes &
escolas (sedes) |
com o módulo entre parênteses |
| 🖥️ Máquinas | Gate & trava · Anomalias · mlinux | com o módulo maquinas |
| Bloco | O que faz |
|---|---|
| 🚦 Falta para começar | O checklist pré-prova (verde/amarelo/vermelho) com botão que abre o painel exato de cada pendência. Vermelho é crítico: confira antes de começar. O checklist é um aviso — o MOJ não impede login nem submissão por causa dele; os itens já conferidos ficam recolhidos. Confere janela, log de julgamento, freeze, juízes, linguagens, TL calibrado, pool, contas, staff e o daemon — e, só com o módulo ligado, coortes, gate de navegador, trava de sede, rodada seguinte, documentos, balões e prorrogação. A checagem módulos avisa quando um módulo está desligado mas tem dados no contest. |
| 🧰 Gerar | Um cartão por artefato, com o estado atual: etiquetas de
credenciais, relatório da prova e jplag sempre (o jplag também abre para
o juiz-chefe, que pode rodar, e para o juiz, que só vê); documentos
(documentos), promover rodada (rodadas),
cerimônia de revelação e telão (telao) com o módulo. |
| 📡 Ao vivo | Resumo curto (pendentes, submissões, juízes online, resposta p95, correção manual). Atualiza sozinho; o painel completo é Operação › Situação. |
| ⏱️ Regras da prova | Início, fim e freeze editáveis ali mesmo, o modo e as linguagens em leitura, e os módulos ligados (com atalho para ligar/desligar). O resto está em Central › Regras. |
| Painel | O que faz |
|---|---|
| Central › Módulos | Liga e desliga os módulos do contest (seção 1½): um cartão por módulo com o que ele abre e se já há dados dele no contest; presets (prova de disciplina · disciplina com Maratona Linux · seletiva · Maratona). |
| Central › Regras | Todas as opções do contest, em cinco seções dobráveis (identidade e janela · o que o time vê · julgamento · placar/freeze/penalidade · acesso). A seção 2 explica opção por opção. A ⏱ prorrogação por sede mora em Evento › Sedes & escolas. |
| Painel | O que faz |
|---|---|
| Problemas | A prova em si: renomear/reordenar/remover, editar o
identificador (a "letra" — pode ser W1,
Q…; reordenar preserva identificador customizado e a cor do
balão migra junto), restringir linguagens ou o pool de juízes POR
problema, atualizar o enunciado a partir do banco (ou enviar HTML/PDF,
por idioma), o painel 🌐 Idiomas do
enunciado (abaixo) e 🏦 Adicionar do banco
(busca e sorteio). |
🌐 Idiomas do enunciado. Um problema do banco pode
ter o enunciado em português, inglês e espanhol (o autor escreve
docs/enunciado.en.md e docs/enunciado.es.md no
pacote). O painel 🌐 Idiomas do enunciado (Prova ›
Problemas; o juiz-chefe tem o mesmo na aba 🌐 Idiomas
do painel dele) tem dois modos:
LOCALE) se ele for
oferecido; senão, no primeiro. O competidor troca com os chips
PT · EN · ES e o MOJ lembra a escolha dele.tar.gz
navegável, publicar como histórico em
/relatorio/<contest>/ (republicar, despublicar) e
publicar o relatório de cada rodada arquivada. A seção 6½ explica.
|| Painel | O que faz |
|---|---|
| Contas | Criar/resetar/desabilitar/remover contas (individual e em lote por .txt/.csv), trocar a senha de todos e o atalho das Etiquetas de credenciais. É AQUI que você cria as contas de papel (seção 3). |
Inscrições (módulo inscricoes) |
O roster do contest (só inscrito entra) e a janela: quando abre, quando fecha (default: o início da prova) e quantos minutos de entrada atrasada. Lista times e individuais, dissolve time, inscreve à mão, cutuca convite pendente por DM (🔔) e exporta CSV. A seção 8½ explica. |
| Sessões | Quem está logado agora, com deslogar; 🚪 sair em massa e trava de login (fechar o login, derrubar todo mundo, reabrir — é o fim de uma prova de sala e a troca de rodada); e o log de acessos por dia. Vale para qualquer contest. |
| Painel | O que faz |
|---|---|
| Situação | O dashboard ao vivo (atualiza em lugar a cada ~12s): logados, juízes
online/ocupados, fila, pendentes, latência, timeline, avaliação manual,
e as ações sugeridas quando algo está fora do lugar.
Balões pendentes/retidos só com o módulo baloes. |
| Staff | Panorama e ação sobre a fila de impressão (+ balões com o módulo),
desempenho por staff e o escopo de cada staff/chefe de
sede (regex ou region:<sede>). |
| Juízes | A fila da correção manual: quem pegou cada submissão, votos, idade; decidir/resolver na hora; e a configuração do veredicto manual (opções de rótulo + matriz de auto-veredicto). |
| Auditoria | Feed unificado de tudo que aconteceu (ações de admin, logins, submissões, veredictos) com filtros e CSV, mais os backups que os usuários subiram (por usuário, com ZIP). |
| Painel (módulo) | O que faz |
|---|---|
Rodadas (rodadas) |
Aquecimento e prova oficial no MESMO contest: planeja cada rodada (janela + problemas), mostra o checklist e promove — arquivando tudo o que aconteceu. A seção 6 explica. |
Documentos (documentos) |
Gera, em PDF e HTML nos três idiomas (pt/en/es), os documentos da prova: informações do ambiente (info sheet), caderno da prova (capa + enunciados), folha de time limits e o editorial (só publica depois do FIM da prova). A seção 5 explica. |
Balões (baloes) |
A cor de cada letra — é o que sai desenhado na folha do balão. O default cobre A–O; com mais de 15 problemas, defina as demais (senão saem cinza). São as cores da rodada no ar. Para dar cores próprias a outra rodada, use Evento › Rodadas. |
Classificação (classificacao) |
Quem se classifica para a próxima fase, por
algoritmo escolhido no painel (hoje: SBC 1ª fase →
Final Brasileira; a regra da PDA entra como outro algoritmo): rascunho,
revisão, promoção pelo comitê e publicação (chip ↑BR no placar).
docs/CLASSIFICACAO.md explica. |
Times (sedes ou
telao) |
Identidade de cada conta no placar: nome do time, país/bandeira, sede, universidade, brasão e foto. Carga por CSV e "materializar matches". |
Coortes (coortes) |
Times convidados (extra-oficiais, "CCL") separados dos oficiais: quem aparece no placar público, quem vê quem, e o 🔓 Liberar resultados do pós-cerimônia. A seção 8 explica. |
Sedes & escolas (sedes) |
As sedes (nome + regex no login) — que alimentam o filtro do placar, o escopo do staff, as etiquetas, as fotos/músicas que cada chefe de sede gere no telão e o gate por sede —, as regras de país/escola por regex e a ⏱ prorrogação por sede/grupo (regex → novo fim; só estende, nunca encurta). |
maquinas)| Painel | O que faz |
|---|---|
| Gate & trava | De onde cada time logou (IP e navegador) em cada rodada, com CSV; a configuração do gate de navegador por sede (esperado × visto por time) e a trava de sede por IP (IPs presos, bloqueios, prender/soltar). A seção 7 explica. |
| Anomalias | O que está fora do lugar no uso das máquinas durante a prova (só com o gate de UA ligado): time com 2 sessões vivas, máquina compartilhada por 2 times, submissão vinda de outra máquina, UA fora da sede, sede com menos máquinas que times, trocas de máquina, a trilha da sessão única e os bloqueios da trava. Linha do tempo, tabela por time, CSV, deslogar, deslogar UA divergente. A seção 7½ explica. |
| mlinux | O panorama das máquinas por sede que o nutellaboot coleta (hardware,
RAM, editores, pressão), com a coleta e os comandos remotos.
docs/NUTELLABOOT.md explica. |
Balão e o freeze. Por padrão, acerto feito com o placar congelado não gera tarefa de balão — e esses balões não são entregues depois: a tarefa não existe. É a regra de competição (o balão andando pela sala revela o que o freeze esconde), e vale só para o balão: pedido de impressão continua livre. Se você quiser o clássico do ICPC — balão circulando durante o freeze, plateia adivinhando — marque Entregar balão durante o freeze em Central › Regras; marcar também libera os que já ficaram retidos. O checklist pré-prova mostra qual política está valendo, e Operação › Situação mostra quantos balões estão retidos.
Como o placar marca quem resolveu. Por padrão a célula de quem resolveu é sempre igual (verde) e a cor do balão vai numa bolinha ao lado. É de propósito: a paleta ICPC dá o problema A branco, e branco sobre o fundo branco do placar é o mesmo pixel — quem resolvia o A parecia não ter resolvido (a queixa que originou a mudança veio de um estudante). Se você preferir o clássico — a célula inteira pintada com a cor do balão — marque em Central › Regras › Célula "resolveu" no placar; as cores claras ganham contorno para não sumirem. Vale para o placar, a cerimônia de revelação e o relatório.
Fora do painel, mas linkadas da Central: etiquetas de credenciais, cerimônia de revelação, jplag, fila do staff e placar.
Um módulo é um grupo de recursos que o contest usa.
Uma prova de disciplina não liga nenhum: o painel mostra só o comum
(problemas, contas, sessões, placar, staff, juízes). Uma prova de
disciplina em laboratório com Maratona Linux liga
maquinas (gate de máquina, sessão única, anomalias). A
Maratona liga todos. Ligar mostra os painéis, as checagens da Central e
os cartões correspondentes; desligar esconde, sem apagar
nada — religar restaura tudo.
| Módulo | O que liga | Detectado por |
|---|---|---|
sedes |
Evento › Sedes & escolas, Evento › Times (identidade), prorrogação por sede, escopo do staff por sede | regions.json, teams-meta.json,
prorrogações |
maquinas |
Máquinas › Gate & trava, Anomalias, mlinux; checagens de gate/trava/sessão única | gate de UA ligado, SITE_LOCK=1, chave do
nutellaboot |
rodadas |
Evento › Rodadas; cartão Promover; relatórios de rodada | rounds.json |
documentos |
Evento › Documentos; cartão Documentos; aba do juiz-chefe | docs/config.json |
baloes |
Evento › Balões; balões na fila do staff e na Situação; balões no freeze | balloons.json |
coortes |
Evento › Coortes | cohorts.json |
inscricoes |
Pessoas › Inscrições | registrations.json |
telao |
cartões Revelação e Telão; Evento › Times (fotos) | webcast.json, fotos de time |
classificacao |
Evento › Classificação (seletor de algoritmo) | classification.json |
virtual |
Evento › Virtual; botão Virtual no card do contest encerrado; link no placar (ver §6¾) | virtual/runs/ |
Onde se liga: Central › Módulos (presets que só
pré-marcam), o passo 7 · Módulos do criar contest,
moj-contest -c <cid> modules on|off ou a seção
modules{} do spec de criação. E sozinho, ao usar o
recurso: criar uma rodada, uma coorte, ligar o gate, gerar um
documento, ligar a inscrição, definir uma cor de balão, uma sede ou uma
chave de webcast — pela web ou pela CLI — liga o módulo correspondente
na hora (o audit registra modules-auto). Só desligar é
manual. Também vale para o spec de criação — um só JSON levanta o
contest inteiro, com os dados de cada módulo (sedes, cores, coortes,
gate, rodadas, documentos, janela de inscrição, telão, classificação); o
export devolve a mesma seção, sem segredos. Contests
criados antes dos módulos são detectados uma vez pelos arquivos que já
têm (server/bin/contest-modules-detect.sh).
Identidade e janela
O que o aluno vê/pode
Julgamento
Pela CLI, tudo isso é
moj contest -c <cid> settings set chave=valor (ex.:
settings set manual_verdict=true review_judges=3).
Habilitar um papel é só criar a conta com o sufixo certo no
login — na aba Usuários & sessões (ou
moj contest -c <cid> users add fulano.judge). Não há
caixinha de permissão: o sufixo É o papel. O auto-cadastro público nunca
cria conta com esses sufixos (reservados), e operações em massa (reset
de senha, desabilitar) pulam contas privilegiadas de
propósito.
| Papel | Sufixo | Pode | Não pode |
|---|---|---|---|
| Administrador | .admin |
Tudo: painel ⚙, submeter a qualquer hora, ver problemas antes da largada, placar sem freeze, votar como juiz, resolver conflitos, responder clarifications. | Aparecer no placar (nenhum papel aparece). |
| Juiz (humano) | .judge |
Aba Avaliar (correção manual), submeter/ver problemas a qualquer hora (testar a prova!), placar sem freeze, responder clarifications, Estatísticas. | Resolver conflitos; painel admin. |
| Juiz-chefe | .cjudge |
Tudo do .judge + painel
Juiz-chefe: resolver conflitos de votos, editar
respostas de clarification já dadas, ver o login e o nome de quem
perguntou, liberar a reserva de outro juiz (botão próprio, com
confirmação), opções e auto-veredicto. |
Painel admin (Configurações etc.). Reservar uma clarification que outro juiz já reservou. |
| Staff | .staff |
Fila de 🖨️ impressão e balões (pegar/imprimir/entregar, modo automático de quiosque). | Ver problemas ou submeter (nunca); etiquetas; placar sem freeze. |
| Chefe de sede | .cstaff |
Observar a fila do staff da sua sede (somente leitura),
Etiquetas de credenciais dos competidores e do
.staff da sua sede (com senha — exceto em
contest que usa contas do treino, onde a senha é pessoal e não sai na
etiqueta; a credencial do próprio chefe também não sai em etiqueta), o
🎥 telão da sede e a 🏆 revelação por
sede depois do fim. |
Agir na fila de impressão; ver problemas/submeter; não herda
.staff. |
| Monitor | .mon |
Submeter DURANTE a prova (sem aparecer no placar), responder clarifications, Todas as Submissões e Estatísticas. | Ver problemas antes da largada; correção manual. |
Regra de ouro: nenhuma conta com sufixo de papel entra no placar ou nas estatísticas — crie quantas precisar sem medo de sujar o resultado.
Com Veredicto manual ligado, o julgamento automático continua rodando, mas o veredicto fica retido: o aluno vê a submissão pendente até juízes humanos validarem.
O fluxo, na aba Avaliar (página do
.judge):
.cjudge) decide no painel
dele (um alerta global avisa).Opções de veredicto. O juiz-chefe ou o admin edita a lista em 🏷️ Opções (painel do juiz-chefe ou Operação › Juízes). Cada opção tem três campos:
5 - NO - Wrong answer.Wrong Answer.Formato de saída errado. Deixe vazio para mostrar a classe.
A classe Accepted não tem texto próprio.Assim cada contest personaliza o que o time lê sem mudar como o placar pontua.
Quantas pessoas você precisa? No mínimo N
contas .judge (o quórum) + 1
.cjudge para conflitos — e recomendo N+1
juízes para a fila não travar quando alguém pausa. O
.admin também vota (conta como juiz), mas em prova grande
deixe o admin livre p/ operar. Com N=1 um único juiz
revisa tudo (bom p/ prova pequena); N=2 é o padrão equilibrado; N≥3 é
para finais onde o veredicto precisa de banca.
documentos)A aba existe para o .admin e para o juiz-chefe
(.cjudge), e produz os documentos da prova — cada
um em PDF e HTML, em português, inglês e
espanhol:
| Documento | O que sai | De onde vêm os dados |
|---|---|---|
| Ambiente de julgamento (info sheet; era "Informações do ambiente") | No padrão da folha da Maratona SBC: sistema operacional e versões dos compiladores, linguagens aceitas com as extensões, limites de memória, tempo, tamanho de fonte, saída e compilação, as linhas de compilação e execução de cada linguagem (as mesmas do juiz), os veredictos, as notas de julgamento, a penalidade e os tempos de resposta. | Texto editável (Markdown) + dados vivos: run/registry
(o que os juízes reportam), o conf do contest e o TL
calibrado. |
| Caderno da prova | Capa + um enunciado por problema, na ordem das letras. Onde o problema tem PDF próprio no contest, é esse PDF que entra (diagramação preservada); senão o enunciado é renderizado. | PROBS do contest,
enunciados/<chave>.{pdf,html} e, se faltar, o
enunciado do banco. |
| Folha de time limits | Tabela letra · nome · tempo limite por teste. Se o
limite é o mesmo em todas as linguagens, sai uma coluna e a nota "não
depende da linguagem". Se difere, sai uma coluna por linguagem. Mais a
errata que você escrever. |
O TL calibrado e servido aos juízes
(run/tl). |
| Editorial | Uma capa (título, data, nota introdutória e índice dos problemas) e a solução de cada problema, na ordem das letras, cada problema em uma página nova. Gere e revise quando quiser; o servidor só deixa PUBLICAR depois do fim da prova (contando prorrogações por sede) — e o time só o baixa com a prova encerrada. | O docs/solucao.md do pacote de cada
problema (o texto que o autor escreveu e que nunca vai ao aluno). |
Fluxo, do começo ao fim
v1.0), nota da capa e
errata. Salve.{{CONTEST_NAME}},
{{DATE}}, {{N_PROBLEMS}},
{{N_PAGES}}, {{SITES}},
{{VERSION}}. Envie um PDF quando a capa for arte pronta do
evento — ela entra como está e o resto do caderno é anexado depois
dela.{{TOOLCHAIN}},
{{TL_TABLE}}, {{LANGS_TABLE}},
{{MEMLIMIT}}, {{STACK}},
{{CONTEST_NAME}} e {{DATE}}. Apagar o texto
volta ao padrão embarcado..admin, .cjudge e .judge
baixam. A sede (.staff, .cstaff), o
.mon e os times só a partir do início — o caderno
na mão de alguém antes da prova é a prova vazada, não importa o papel. A
sede imprime a partir do início (o + notícia desses dois é
recusado antes do início, porque a notícia anexa o PDF).Regenerou? Publique de novo não é preciso — o link publicado aponta para o documento atual, então gerar de novo já entrega a versão nova a quem baixar. Mas avise a sede: quem já imprimiu ficou com a versão velha (é para isso que serve o campo versão do caderno na capa).
🌐 O caderno e o editorial saem no idioma do documento. O caderno em inglês usa o
enunciado.en.mdde cada problema (ou o HTML/PDF em inglês que você enviou no painel de Problemas), e o editorial em inglês usa osolucao.en.md. Um problema sem tradução sai em português no meio do caderno — o documento nunca fica só com a capa traduzida. O título do problema sai traduzido quando o pacote tem o título naquele idioma. Prova bilíngue com enunciado pronto por fora continua entrando pelo PDF enviado.
🔒 O caderno é conteúdo de prova. Antes de publicar, só
.admine.cjudgeo baixam. Publicado, antes do início só os juízes (.judge) somam-se a eles. Para a sede e os times a API responde 404 até o início — não é uma trava de interface.
rodadas)Toda maratona roda um aquecimento (dress rehearsal) antes da prova: dois ou três problemas fáceis, no dia anterior ou na manhã do dia, para o time ligar a máquina, testar o login, o editor, a impressão e o balão — e para a sua equipe de juízes e staff ensaiar. Depois disso a prova começa no mesmo contest, porque é a configuração dele (contas, senhas, sedes, cores de balão, time limits, linguagens, pool de juízes) que você quer garantir.
No MOJ isso são rodadas. A rodada no ar é a que aparece em Central › Regras e em Prova › Problemas; as demais ficam planejadas até você promover.
O roteiro (repare na ordem: o aquecimento vem PRIMEIRO)
aquecimento, tipo aquecimento) e crie a
próxima (oficial): janela, freeze e a lista de
problemas da prova de verdade. A lista fica guardada e só entra no ar na
promoção — ninguém vê os problemas da prova antes. Você pode usar
qualquer problema que o dono do contest pode ver: público, seu, de
colaborador ou da sua org. A regra é a mesma de Prova › Problemas, na
rodada no ar e na planejada. Cada rodada pode ter as suas cores
de balão. Abra a rodada, vá em "🎈 Cores dos balões desta
rodada" e salve. As cores entram no ar quando a rodada for promovida.
Uma rodada sem cores próprias herda as cores em vigor. Na rodada no ar,
esta seção e Evento › Balões editam a mesma coisa.rounds/<rodada>/, mais um relatório
navegável da rodada;freeze_locked com a hora. A
opção "ignorar os bloqueadores" não passa por cima desta regra. Você
digita o id do contest para confirmar. Tudo é auditado.Registrei a PROVA primeiro — e agora? Aconteceu de montar o contest já com a prova e só depois criar a rodada de aquecimento? Não promova — promover arquiva a rodada no ar (a sua prova, vazia), e arquivo é imutável. O certo é inverter editando as duas rodadas ali mesmo (o painel avisa quando detecta uma planejada começando antes da que está no ar):
prova, tipo prova oficial, e dê a ela a janela +
freeze da prova; em Problemas da rodada, coloque a
lista da prova (fica guardada, ninguém vê).aquecimento, tipo aquecimento, janela do
aquecimento (sem freeze) e troque os problemas pelos do aquecimento — na
rodada no ar, salvar aplica na hora..tar.gz — com código-fonte — sai por um clique, para a
auditoria posterior.O checklist é sério. A promoção RECUSA enquanto houver:
| Bloqueador | Por quê |
|---|---|
round_running |
a rodada no ar não terminou (contando prorrogação por sede) |
jobs_in_flight |
tem submissão no spool/fila do juiz. Se ela fosse julgada depois da troca, o tempo seria calculado contra o início da prova e a submissão do aquecimento reapareceria no histórico da prova |
pending_verdicts |
ainda há submissão sem veredicto no histórico |
review_pending |
tem submissão na correção manual sem veredicto liberado — o voto do juiz cairia no placar da prova |
judged_down |
o daemon de julgamento não está vivo, então a fila não drena |
no_next_round |
não há rodada planejada |
Há um --force (checkbox "ignorar os bloqueadores"), para
emergência: ele não desfaz o risco, só assume que você
sabe o que está fazendo. O único que o --force
não ignora é o no_next_round (sem rodada
planejada não há para onde promover).
Contest que usa as contas de outro (
USERS_FROM) promove normalmente — o arquivamento só mexe nousers/local. Já foi bloqueador; deixou de ser, porque é justamente o caso de uso real (aquecimento + prova com as contas do treino).
O que NÃO muda na promoção: contas e senhas, times/sedes/bandeiras, escopo do staff, cores de balão, regiões, time limits calibrados, linguagens, pool de juízes, matriz de auto-veredicto e os textos/capa dos documentos. O que zera: placar, histórico e submissões dos times (arquivados, não perdidos), balões, numeração de impressão, prorrogações, e a lista de documentos publicados.
⚠️ Cores de balão são por LETRA. Se o problema A do aquecimento e o A da prova são diferentes, a cor do balão A é a mesma nas duas rodadas. Confira em 🎨 Aparência antes da prova.
Na CLI:
moj contest -c <cid> rounds ls | add | set | problems | promote | publish | archive.
Quando a prova acaba, o placar continua congelado e os documentos seguem não publicados até alguém mandar liberar — nada disso vira automático com o relógio. A Central passa a mostrar o bloco "Depois da prova" com o checklist do que ainda está fechado e o botão 🏁 Encerrar evento, que faz de uma vez as duas coisas que todo mundo esquece:
FREEZE_TIME=0), então o resultado final fica público (é o
mesmo efeito do botão "🔓 Descongelar tudo" da cerimônia de revelação).
O MOJ só aceita descongelar a partir do fim da prova para todas
as sedes + 1 minuto. A prorrogação de uma sede conta. A regra
vale para todos os caminhos: este botão, a cerimônia, o campo de freeze
na Central e a promoção de rodada. A tela mostra a hora a partir da qual
o botão fica disponível;O botão não mexe no resto: liberar o
relatório de correção para os times
(SHOWLOG), mostrar os limites de tempo e
liberar as coortes (convidados) continuam sendo escolha
sua — cada um aparece no checklist com o atalho "resolver →" para a tela
certa. Só roda depois que a prova terminou para todas as
sedes (prorrogação por sede conta) e pode ser repetido à
vontade: na segunda vez ele não faz nada.
Fecha o ciclo com o relatório final (Prova ›
Relatório): o tar.gz navegável leva o placar aberto, as
submissões, as estatísticas completas, os enunciados e
os documentos publicados — é o pacote que se manda para os participantes
e para o arquivo do evento. Ao lado do download há 📢 Publicar
relatório: o mesmo site passa a existir em
https://moj…/relatorio/<contest>/ e o card do contest
na página inicial e no /contests/ ganha o botão 📑
Relatório — é o histórico do evento. A geração
roda em segundo plano (~1–2 min numa prova grande; o painel mostra
"publicando…" e troca sozinho quando termina). É público: o relatório
não carrega código-fonte, log de juiz nem senha, e as clarifications
saem anônimas, mas mostra nomes de times, runs e estatísticas — publique
quando tudo já foi divulgado. Republicar gera de novo e
troca o site inteiro de uma vez (quem estiver lendo não vê
meio-caminho); Despublicar apaga o endereço e o botão
dos cards. As rodadas arquivadas (aquecimento, por
exemplo) têm o próprio botão em Prova › Relatório: 🌐 publicar
relatório (público) coloca o relatório gerado na promoção em
/relatorio/<contest>/rodada/<slug>/ — e a
página inicial do relatório principal, ao ser (re)publicada, passa a
linkar as rodadas públicas em "Rodadas anteriores deste evento".
virtual)Com a prova encerrada, qualquer conta do Treino Livre pode
refazer o contest uma vez, no próprio tempo, contra o
placar oficial. O placar oficial não muda. Referência
completa: docs/VIRTUAL.md.
Para ligar: Central › Módulos › Participação virtual. O módulo só liga quando:
Você pode ligar o módulo antes do fim da prova. Ele fica inerte e abre sozinho quando a prova termina para todas as sedes e o placar é descongelado (botão Encerrar evento).
Atenção: ligar este módulo torna o placar final e a lista de problemas visíveis para contas do treino. Um contest que não pode ser visto por fora não deve ligar o módulo.
O painel Evento › Virtual mostra:
/treino/virtual/?c=<contest>);Regra do participante (ele a lê antes de largar): uma participação por conta; pode desistir sem gravar nos primeiros 15 minutos ou enquanto não tiver nenhum aceito, no máximo 2 vezes; a 3ª largada é definitiva.
maquinas)É no aquecimento que os times ligam de fato os computadores — e é dali que o MOJ tira o mapa time × IP × navegador da sala (do log de acessos do contest, recortado pela janela da rodada: nada novo é capturado). A aba mostra, por rodada:
Duas ações saem daqui e escrevem no lugar de sempre:
Quando cada sede roda a sua imagem, o UA de cada
máquina carrega um pedaço do próprio login do time:
teambrspso001 (Brasil/BR, São Paulo/SP, Sorocaba/SO) roda
numa imagem cujo UA contém brspso. Uma substring única não
serve — então o MOJ deriva o esperado do login.
Na web (seção 🔒 de Máquinas › Gate & trava): a
chave "Barrar quem não vem da imagem da sede"
liga/desliga; abaixo dela vão a regex do login com
captura e o UA esperado (\1), com
um testador ao vivo ("testar com o login" → UA
precisa conter brspso · sede Sorocaba), e três listas
dobráveis — overrides por sede, regras por
regex de login e isentos. Salvar já vale para
o próximo login.
Na CLI, o mesmo:
moj contest -c <cid> ua-gate set --from-login '^team([a-z]{6})[0-9]{3}$' --expect '\1'
moj contest -c <cid> ua-gate set --region 'Sorocaba=brspso-v2' # sede fora do padrão
moj contest -c <cid> ua-gate set --exempt '^ccl' --exempt time-reserva-07
moj contest -c <cid> ua-gate check teambrspso001 # o que se espera dele
moj contest -c <cid> ua-gate show
Uma regra cobre todas as sedes de uma vez. A ordem
de resolução é: isentos › conta de papel (sempre entra)
› regra por regex › override da sede › captura no login
› substring única (o login_ua_substring de sempre, que
continua valendo como último recurso).
--mode off desliga o gate sem apagar a configuração.curl --resolve moj…:443:<IP>
da máquina de prova ao site base (treino, backups que o aluno subiu
antes, outro contest). Com a trava, cada login de competidor
prende o IP de origem (a saída da sede) a esta prova
até o fim + folga; daquele IP qualquer outro alvo responde 403
site_locked, inclusive sessão do treino aberta
antes. Contas de papel são isentas. Toda reivindicação e todo
bloqueio vão ao audit (site-lock-claim,
site-lock-block) e aparecem em Máquinas › Gate & trava
(trava de sede), com "soltar" por IP e "prender IPs já vistos" (útil na
manhã da prova). Efeito colateral aceito: durante a janela, todo mundo
atrás daquele IP público perde o treino.Na Maratona 2026 só deu para responder "algum time usou duas
máquinas?" depois da prova, cruzando logs à mão. O painel
Máquinas › Anomalias responde durante
a prova (as sessões ativas, o sair em massa e o log de acessos, que
valem para QUALQUER contest, ficam em Pessoas ›
Sessões). Ele só vale com o gate de UA ligado:
é o navegador da imagem do mlinux que identifica a máquina
(machine_id/boot_id). Login de navegador comum só tem o IP,
e atrás de NAT o IP é a sede inteira: esses logins ficam fora das
anomalias de máquina (aparecem só em "UA fora da sede" e na lista de
sessões). Com o gate desligado o painel avisa e mostra só as sessões e o
log de acessos.
login_disabled; a organização entra),
deslogar competidores, staff e chefes de
sede ou os dois (nunca admin, juízes, chefe, monitor nem
telão), promover a rodada em Evento › Rodadas, e reabrir o
login quando os times puderem entrar. Cada sessão derrubada
vira evento na linha do tempo; a ação vai ao audit
(logout-all).moj-comp)
e de pacotes offline. Vale mesmo sem gate. A CLI se
identifica no User-Agent (moj-comp/<build>) e, na
máquina de prova, manda na frente o mesmo User-Agent do
navegador da imagem (lido de /etc/moj/user-agent,
gravado pela imagem): é assim que ela passa no gate por sede e fica com
a mesma chave de máquina do browser — usar as duas na mesma máquina não
derruba a sessão. Fora da máquina de prova a CLI é barrada pelo gate
(403), de propósito.var/submit-origin.log; os
logins em var/access.log; as quedas de sessão em
var/session-events.log — os três atravessam as rodadas e
entram no arquivo.coortes)Maratona convida times que competem sem entrar na disputa oficial — o pessoal chama de convidado, extra-oficial, "CCL". O MOJ trata isso como coorte: um grupo de times com política de visibilidade própria.
O que uma coorte privada garante
/contest/teams, que é
público e listava todo login);Como configurar (Evento › Coortes)
Uma linha por coorte, com o que decide o comportamento: id, nome, regex do login, pública (aparece no placar público), extra-oficial (entra sem consumir posição), padrão (quem não casa nada cai nela) e vê — as caixas que dizem quais coortes aquela visão enxerga (a coorte sempre vê a si mesma). A coluna times conta quantos estão em cada uma.
– no lugar da posição. Com a
opção ligada, ele mostra a posição entre os convidados, em itálico, no
placar, na revelação e no relatório. A numeração oficial não muda.build.sh mantém (uma por coorte que vê um conjunto
diferente, mais a pública).Para mudar a coorte padrão, marque o rádio da outra linha e salve aquela linha. Remover uma coorte exige que ela esteja vazia (e a padrão nunca é removível).
A mesma coisa na CLI:
moj contest -c <cid> cohorts ls
moj contest -c <cid> cohorts add ccl --name "Café com Leite" --regex ccl --private --unranked
moj contest -c <cid> cohorts assign timeconvidado07 ccl # convidado sem 'ccl' no login
moj contest -c <cid> cohorts materialize # carimba a regra em campo por time
moj contest -c <cid> cohorts release # o "liberamos tudo" (pede o id)
A coorte casa por regex no login e/ou pelo campo
.team.cohort de cada time (o campo vence).
materialize transforma a regra em dado: depois disso, mudar
o regex não remaneja ninguém. Quem não casa nada cai na coorte
default (a dos oficiais).
O que continua completo, de propósito — são papéis privilegiados, e você precisa deles: Todas as Submissões, Estatísticas (inclusive quem resolveu primeiro), a fila do staff (o balão do convidado tem de ser entregue) e o relatório final. Duas consequências práticas:
SHOWCODE) foi
removida em 2026-09-18;ℹ️ Sobram dois canais numéricos que não escondem identidade mas existem: a página de status pública conta as submissões pendentes de todos os times, e a numeração de tarefas de impressão é única por contest (saltos indicam atividade que o time não vê).
Vale para contest criado com "usuários compartilhados do Treino Livre". Ligando a inscrição (Pessoas › Inscrições → Ligar inscrição), o contest passa a ter uma porta: quem não se inscreveu não entra (a API recusa o login, não é só a tela).
Como a pessoa se inscreve: no site principal, logada
no treino, em /contests/inscricao/?c=<id> (o cartão
do contest na home ganha o botão 📝 Inscreva-se). Ela
escolhe individual ou criar um time:
dá um nome e convida até 2 logins do treino; cada convidado precisa
aceitar. Enquanto a janela estiver aberta dá para sair,
renomear e desfazer. Participação é exclusiva — aceitar convite desfaz a
inscrição individual.
O convite avisa sozinho. No instante em que o
capitão convida, o mojinho manda uma DM ao convidado
com o link de aceitar/recusar; e na véspera do
fechamento (24 h antes) manda um único último
aviso para quem ainda não respondeu (a mensagem sai em português; se o
contest estiver com LOCALE=en, vai em inglês
e português no mesmo texto — DM não tem seletor de
idioma). Só alcança quem tem Telegram vinculado (perfil
do treino → 📨 Telegram) — por isso a lista de convites mostra
📨 (alcançável) ou ⚠️ (sem canal), e o resumo
conta quantos ficaram sem. Na tabela de times, cada convite pendente tem
o botão 🔔 para cutucar na hora, e o cabeçalho tem
🔔 Lembrar todos; cutucar à mão não
cancela o aviso automático da véspera. Para desligar o automático neste
contest, desmarque lembrete automático na caixa da janela
(grava REG_REMIND=n). Isso importa porque quem não
aceita o convite não entra no time — e às vezes nem está
inscrito.
Na prova, cada membro entra com o PRÓPRIO login e senha do
treino e a sessão vira a do time: o placar, os balões e a
impressão veem uma linha só. Quem estava no teclado
fica registrado (var/actor-log e a 5ª coluna do
var/access.log) — útil para conferir depois.
A janela (Pessoas › Inscrições → Janela de
inscrição): abre (vazio = já aberta),
fecha (vazio = o início da prova) e
atraso (min) — minutos após o início em
que ainda dá para entrar, mas na coorte …-atrasado, que
aparece no placar sem ocupar posição (é a extra
registration do Codeforces). Passou disso, a porta fecha.
Em que relógio estão esses campos: no do seu
navegador — a caixa mostra qual é, logo abaixo. Já as horas que
o MOJ escreve para as pessoas (a DM do mojinho, o
checklist pré-prova, a data do caderno, o relatório final) saem no
fuso da prova, que você define em Central › Regras
→ 🕒 Identidade e janela → Fuso horário da prova (vazio =
America/Sao_Paulo). Quando os dois relógios diferem, a
caixa da janela mostra também o horário no fuso da prova, para não haver
dúvida.
Placar: a inscrição semeia as coortes
individual e times, cada uma com
placar próprio — o seletor "Placar: Geral | Times |
Individual" aparece sozinho na página do placar. Se o contest já tinha
coortes configuradas, o checklist pré-prova avisa que faltam essas
duas.
Com AQUECIMENTO (o esquenta que fica dias no ar):
planeje as duas rodadas em Prova → Rodadas (aquecimento agora,
prova oficial na data real). Por padrão o aquecimento também
exige inscrição — é nele que o competidor resolve login,
submissão e placar; deixar entrar sem inscrição só empurra o problema
para o dia da prova. A inscrição fecha sozinha no início da
prova oficial (é essa data que o "fecha" herda, não a do
aquecimento). Se você preferir o aquecimento de porta aberta (qualquer
conta da fonte entra sem inscrição), ligue
REG_WARMUP_OPEN=y no conf — nesse caso a
promoção derruba a sessão de quem não se inscreveu e o
placar da prova nasce só com os inscritos; o painel mostra o selo 🔥
aquecimento: entrada livre enquanto isso vale.
O modo de participação é definitivo: depois de inscrito (individual ou em time), o competidor não cancela nem troca de modo sozinho — a página de inscrição deixa isso claro antes da escolha, e qualquer mudança passa por você (Pessoas › Inscrições: remover, dissolver, inscrever à mão).
O time também declara na inscrição: a
universidade (vira o prefixo
[SIGLA] Nome do Time no placar e a coluna/filtro de
escola), o uso de IA (aparece como 🤖 ao lado do nome —
é transparência, não julgamento), a bandeira (país ou
estado do Brasil — a bandeirinha do placar) e uma foto do
time (a que vai ao telão; reprocessada no servidor, sem
metadados). Tudo editável pelo capitão enquanto a janela estiver aberta,
e visível no seu painel e no CSV. O inscrito INDIVIDUAL declara
as mesmas coisas (menos a foto): universidade, IA e bandeira,
na inscrição ou depois, pela mesma página. A organização ajusta qualquer
um pelas ações team-meta/individual-meta do
painel — sem regra regex no teams-meta.json (o mecanismo
legado continua valendo só como sobreposição visual).
Dica de dia de prova: o checklist da Central mostra quantos se inscreveram e quantos convites ficaram pendentes — convite não aceito significa gente achando que está no time e que, na hora, não entra.
Cole na carga em lote de Pessoas › Contas (uma linha por
conta: login nome), ou crie um a um com
moj contest -c <cid> users add <login> --name "<nome>":
juiz1.judge Juiz Um
juiz2.judge Juiz Dois
juiz3.judge Juiz Três (reserva do quórum de 2)
chefe.cjudge Juiz Chefe
apoio1.staff Staff de impressão e balões
sede1.cstaff Chefe da Sede 1 (etiquetas + revelação)
monitor1.mon Monitor (responde clarifications)
Depois: ligue Veredicto manual (e ajuste o Nº de juízes) em Central › Regras; distribua as senhas geradas; cada pessoa loga na MESMA tela do contest e vê os botões do seu papel.
O painel administrativo do Treino Livre (/treino/admin/,
conta .admin) tem a aba 🏆 Contests. Ela
lista os contests criados pela interface e controla quem pode criar
contests e problemas.
Quem vê o quê. A regra vale na API, não só na tela.
.admin listada em
SUPERADMINS no arquivo contests/treino/conf
(logins separados por espaço). Só quem tem acesso ao servidor edita essa
lista. Não há tela para isso.Filtros da lista. Busque por nome, id ou dono. Filtre por dono, modo e situação (por vir, em andamento, encerrado). Ordene por data de criação, início, nome ou dono. Marque só os meus para ver apenas o que você criou. O dono aparece com foto, nome e link para o perfil.
Id reservado. Um id que começa por icpc
é da organização da Maratona. Só um super-admin cria um contest com esse
id. O assistente avisa antes e a API recusa.
Quem pode criar contests e problemas. A mesma
permissão vale para criar contests e para criar problemas e coleções na
Gestão de Problemas. Contas .admin sempre podem. Para as
demais: